package com.xk._04regEx;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @description: 分组：非命名捕获 和 命名捕获
 * @author: xu
 * @date: 2022/11/1 13:45
 */
public class RegExp_07 {
    public static void main(String[] args) {
        String content = "hanshunping s7789 nn1189han";

        // 匹配 任意4个数字字符 的字符串 [无分组] --> \\d\\d\\d\\d
        // 这是一个非命名分组 --> (\\d\\d)(\\d\\d)
        // 说明：
        //  1. matcher.group(0) 得到匹配到的字符串
        //  2. matcher.group(1) 得到匹配到的字符串的第一个分组内容
        //  3. matcher.group(2) 得到匹配到的字符串的第二个分组内容
        //  4. ……
        // String regStr = "(\\d\\d)(\\d\\d)";
        // System.out.println("匹配到的字符串：" + matcher.group(0));
        // System.out.println("第一个分组内容[通过索引]：" + matcher.group(1));
        // System.out.println("第二个分组内容[通过索引]：" + matcher.group(2));

        // 这是一个命名分组，即可以给分组命名 --> (?<g1>\d\d)(?<g2>\d\d)
        // System.out.println("匹配到的字符串：" + matcher.group(0));
        // System.out.println("第一个分组内容[通过组名]：" + matcher.group("g1"));
        // System.out.println("第二个分组内容[通过组名]：" + matcher.group("g2"));
        String regStr = "(?<g1>\\d\\d)(?<g2>\\d\\d)";

        Pattern pattern = Pattern.compile(regStr);
        Matcher matcher = pattern.matcher(content);
        while (matcher.find()){
            System.out.println("找到：" + matcher.group(0));
            System.out.println("第一个分组内容[通过组名]：" + matcher.group("g1"));
            System.out.println("第二个分组内容[通过组名]：" + matcher.group("g2"));
        }
    }

    /*
    * 小结：
    * 1. (pattern)
    *       非命名捕获。捕获到的子字符串。编号为0的第一个捕获是由整个正则表达式模式匹配的文本，
    *       其他捕获结果则根据左括号的顺序从1开始自动编号。
    * 2. (?<name>pattern)
    *       命名捕获。将匹配的子字符串捕获到一个组名称或编号名称中。
    *       用于name的字符串不能包含任何标点字符，并且不能以数字开头。可以使用单引号替代尖括号，例如 (?'name')
    * */
}
